package frame;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowListener;
import java.util.LinkedList;
import java.util.List;

import javax.swing.*;

import objetosGraficos.*;
import logica.*;

public class FrameJuego extends JFrame {
	
	// Atributos de instancia
	
	private Teclado keyListener;
	private NaveJugador NaveJugador; 
	private JPanel panelJuego;
	private List<NaveEnemiga> navesEnemigas;
	private tanteador marcador;
	private anuncio anuncioLabel;
	private Thread anuncioThread;

	// Constructor
	
	public FrameJuego () {
		super("Space Fighter");
		gui();
		listeners();
	}
	
	// Métodos
	
	private void gui(){	
		this.setSize(550,700);
		this.setResizable(false);
		this.setLayout(null);
		
		
		//Inicialización de componentes gráficas
		panelJuego = new JPanel ();
		panelJuego.setLayout(null);
		panelJuego.setSize(550,700);
		panelJuego.setPreferredSize(new Dimension(550,700));
		panelJuego.setOpaque(false);
		
		
		
		//Creación de naves
		NaveJugador = new ACR_189S();	
		navesEnemigas = new LinkedList<NaveEnemiga>();
		for (int i = 0; i < 10; i++) {
			RAPTOR_5 nave = new RAPTOR_5();
			nave.setMovimiento(NaveEnemiga.ABAJO);
			nave.setFocusable(false);
			nave.morir();
			navesEnemigas.add(nave);
			panelJuego.add(nave);
		
		}
		
		// Puntaje		
		marcador = new tanteador();
		marcador.setBounds(350,0,200,30);
		panelJuego.add(marcador);
		
		//Agregar nave
		panelJuego.add(NaveJugador);
	
		//Nivel actual
		Nivel nivelActual = new Nivel1();
		
		//Anuncio
		anuncioLabel = new anuncio (this.getWidth(),this.getHeight(),this,panelJuego);
		panelJuego.add(anuncioLabel);
		anunciar(nivelActual.getNombre());

		//Thread naves
		MovimientoNaves mn = new MovimientoNaves (this,NaveJugador,navesEnemigas);
		mn.setNivel(nivelActual);
		mn.start();
		
		//Agregar paneles
		this.add(panelJuego);
		repaint();
	}
	
	
	private void listeners(){
		
		//Oyente Teclado
		keyListener = new Teclado(this, NaveJugador);
		keyListener.start();
		this.addKeyListener(keyListener);

		//Oyente Ventana
		this.addWindowListener(new oyenteCerrar());

	}
	
	private void anunciar (String text){
		anuncioThread = new Thread(anuncioLabel);
		anuncioLabel.setText(text);
		Point pos = anuncioLabel.getPosicion();
		anuncioLabel.setLocation(pos.x,pos.y);
		anuncioThread.start();
	}

	private void cerrarAplicacion (){
		this.dispose();
		System.exit(0);
	}
	
	
	private class oyenteCerrar implements  WindowListener{
		public void windowDeactivated(WindowEvent arg0) {}
		public void windowDeiconified(WindowEvent arg0) {}
		public void windowIconified(WindowEvent arg0) {}
		public void windowOpened(WindowEvent arg0) {}
		public void windowActivated(WindowEvent arg0) {}
		public void windowClosed(WindowEvent arg0) {}
		
		public void windowClosing(WindowEvent arg0) {
			cerrarAplicacion();
		}
	}
	
	public List<NaveEnemiga> getNavesEnemigas () {
		return navesEnemigas;
	}
	

	
	public void aumentarPuntaje (int n) {
		marcador.aumentarPuntaje(n);
	}	
	
	
	public void eliminarNaveJugador () {
		panelJuego.remove(NaveJugador);
		repaint();
	}
	
	
	public void disparo (Point coord){
		Bala disparo = new Bala (NaveJugador.getNombre(),coord.x,coord.y);
		panelJuego.add(disparo);
		MovimientoBala mb = new MovimientoBala(this, panelJuego,disparo);
		mb.start();
	}
	
	public void gameOver(){
		anunciar("You lose");
	}
	
	public void win(){
		anunciar ("You Win!");
		NaveJugador.setSalud(0);
	}
}

